/**
 * 请求相关类型定义
 * 基于项目实际的 HTTP 工具实现
 */

import { AxiosRequestConfig } from "axios";

// 请求方法类型
export type RequestMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";

// 错误消息模式
export type ErrorMessageMode = "none" | "modal" | "message" | "notification";

// 请求头类型
export interface RequestHeaders {
  [key: string]: string | number | boolean | undefined;
  "Content-Type"?: string;
  Authorization?: string;
  Accept?: string;
  "Accept-Language"?: string;
}

// 扩展的请求配置（基于项目实际使用的 ExtendedAxiosRequestConfig）
export interface ExtendedRequestConfig extends AxiosRequestConfig {
  /** 请求URL */
  url: string;
  /** 请求方法 */
  method?: RequestMethod;
  /** 请求头 */
  headers?: RequestHeaders;
  /** URL参数 */
  params?: Record<string, any>;
  /** 请求体数据 */
  data?: any;
  /** 请求超时时间(毫秒) */
  timeout?: number;
  /** 是否显示错误消息，默认为 true */
  showErrorMessage?: boolean;
  /** 是否携带凭证(cookie) */
  withCredentials?: boolean;
  /** 响应类型 */
  responseType?:
    | "json"
    | "text"
    | "blob"
    | "arraybuffer"
    | "document"
    | "stream";
  /** 基础URL */
  baseURL?: string;
  /** 是否自动重试 */
  enableRetry?: boolean;
  /** 最大重试次数 */
  maxRetries?: number;
  /** 重试延迟时间(毫秒) */
  retryDelay?: number;
}

// 请求配置选项（兼容旧版本）
export interface RequestOptions {
  /** 是否将参数拼接到URL */
  joinParamsToUrl?: boolean;
  /** 是否格式化日期 */
  formatDate?: boolean;
  /** 是否转换响应数据 */
  isTransformResponse?: boolean;
  /** 是否返回原生响应 */
  isReturnNativeResponse?: boolean;
  /** 是否添加前缀 */
  joinPrefix?: boolean;
  /** API URL */
  apiUrl?: string;
  /** 错误消息模式 */
  errorMessageMode?: ErrorMessageMode;
  /** 是否添加时间戳 */
  joinTime?: boolean;
  /** 是否忽略取消令牌 */
  ignoreCancelToken?: boolean;
  /** 是否携带token */
  withToken?: boolean;
  /** 是否显示错误消息 */
  showErrorMessage?: boolean;
}

// 基础请求配置（向后兼容）
export interface BaseRequestConfig extends ExtendedRequestConfig {
  /** 请求选项 */
  options?: RequestOptions;
}

// API 响应基础结构
export interface ApiResponse<T = any> {
  /** 状态码 */
  code: number;
  /** 响应消息 */
  msg: string;
  /** 响应数据 */
  data: T;
  /** 时间戳 */
  timestamp?: number;
  /** 请求ID */
  requestId?: string;
}

// 分页请求参数
export interface PaginationParams {
  /** 当前页码 */
  pageNum?: number;
  /** 每页条数 */
  pageSize?: number;
  /** 排序字段 */
  orderBy?: string;
  /** 排序方向 */
  orderDirection?: "asc" | "desc";
}

// 分页响应数据
export interface PaginationResponse<T = any> {
  /** 数据列表 */
  rows: T[];
  /** 总条数 */
  total: number;
  /** 当前页码 */
  pageNum: number;
  /** 每页条数 */
  pageSize: number;
  /** 总页数 */
  pages: number;
}

// 文件上传配置
export interface UploadConfig extends ExtendedRequestConfig {
  /** 文件字段名 */
  name?: string;
  /** 文件对象 */
  file: File | Blob;
  /** 额外的表单数据 */
  formData?: Record<string, any>;
  /** 上传进度回调 */
  onUploadProgress?: (progressEvent: any) => void;
}

// 下载配置
export interface DownloadConfig extends ExtendedRequestConfig {
  /** 文件名 */
  filename?: string;
  /** 是否显示下载进度 */
  showProgress?: boolean;
  /** 下载进度回调 */
  onDownloadProgress?: (progressEvent: any) => void;
}

// HTTP 错误信息
export interface HttpErrorInfo {
  /** 错误码 */
  code: number;
  /** 错误消息 */
  message: string;
  /** 错误详情 */
  details?: any;
  /** 请求URL */
  url?: string;
  /** 请求方法 */
  method?: string;
  /** 时间戳 */
  timestamp: string;
}

// 请求拦截器配置
export interface RequestInterceptorConfig {
  /** 是否自动添加token */
  autoAddToken?: boolean;
  /** token字段名 */
  tokenKey?: string;
  /** token前缀 */
  tokenPrefix?: string;
  /** 是否自动设置Content-Type */
  autoSetContentType?: boolean;
}

// 响应拦截器配置
export interface ResponseInterceptorConfig {
  /** 成功状态码 */
  successCode?: number | number[];
  /** 是否自动处理错误 */
  autoHandleError?: boolean;
  /** 是否自动显示成功消息 */
  autoShowSuccessMsg?: boolean;
  /** 是否自动显示错误消息 */
  autoShowErrorMsg?: boolean;
}
